// polyfill和配置需要在最顶部，任何其他代码之前
(function setupGlobalEnvironment() {
	// 安全获取全局对象的函数
	function getGlobalObject() {
		if (typeof globalThis !== 'undefined') return globalThis;
		if (typeof global !== 'undefined') return global;
		if (typeof wx !== 'undefined') return wx;
		if (typeof self !== 'undefined') return self;
		return {};
	}

	// 获取全局对象
	const globalObj = getGlobalObject();

	// 设置全局process对象
	if (typeof globalObj.process === 'undefined') {
		globalObj.process = {
			env: {
				// 默认为生产环境
				NODE_ENV: 'production'
			}
		};

		// 尝试暴露到全局作用域
		try {
			process = globalObj.process;
		} catch (e) {
			console.warn('无法设置全局process变量');
		}
	}
	
	// 添加全局Trace对象，修复"Trace is not defined"错误
	if (typeof globalObj.Trace === 'undefined') {
		globalObj.Trace = {
			// 模拟Trace对象的基本方法
			debug: function() {},
			info: function() {},
			warn: function() {},
			error: function() {}
		};
		
		// 尝试暴露到全局作用域
		try {
			Trace = globalObj.Trace;
		} catch (e) {
			console.warn('无法设置全局Trace变量');
		}
	}
	
	console.info('[应用初始化] 已设置基础环境变量');
})();

// 然后加载polyfill文件
require('./helpers/mobx_polyfill');

/*
 * @Author: bug巫师 184179023@.com
 * @Date: 2025-04-25 18:47:40
 * @LastEditors: bug巫师 184179023@.com
 * @LastEditTime: 2025-04-27 10:29:21
 * @FilePath: \ABS.OA\miniprogram\app.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
/**
 * 应用入口
 */

// 加载微信环境的polyfill
import './helpers/wx_polyfill';

// 引入MobX设置助手 - 确保在所有其他导入前执行
import './store/helpers/mobx_setup';

// 初始化MobX环境
import { setupMobXEnvironment } from './store/helpers/mobx_setup';
setupMobXEnvironment();

// 输出环境配置信息
console.info('[应用初始化] 当前环境:', process?.env?.NODE_ENV);

// 引入全局Store
const { appStore, cacheStore, errorHandler } = require('./store/global/index');
const { uiStore, userStore, messageStore } = require('./store/modules/index');
const SystemHelper = require('./helpers/system_helper.js');
const setting = require('./config/projects.js');

// 引入性能监控和数据一致性工具
const { performanceMonitor } = require('./helpers/performance_monitor');
const { dataConsistencyChecker } = require('./helpers/data_consistency_checker');

// 引入全局模块配置入口，确保所有间接引用的文件被加载
// 此配置文件包含所有未直接使用但需要保留的JS文件
// 使用统一配置入口模式解决"主包不应存在未使用的JS文件"的问题
// 详细说明请参考 config/global_modules_config.js 文件注释
const globalModules = require('./config/global_modules_config');

// 添加全局错误处理
const originalConsoleError = console.error;
console.error = function(...args) {
	// 过滤掉Trace未定义的错误和null的join错误
	if (args.length > 0 && typeof args[0] === 'string' && 
			(args[0].includes('Trace is not defined') || 
			 args[0].includes('WebAssembly.instantiate()') ||
			 args[0].includes('Cannot read property \'join\' of null'))) {
		// 忽略特定错误
		return;
	}
	// 正常处理其他错误
	originalConsoleError.apply(console, args);
};

// 监听全局未捕获的Promise错误
wx.onUnhandledRejection(({reason}) => {
	if (reason && reason.message && 
			(reason.message.includes('Trace is not defined') || 
			 reason.message.includes('WebAssembly.instantiate()') ||
			 reason.message.includes('Cannot read property \'join\' of null'))) {
		// 忽略特定错误
		return;
	}
	console.error('未捕获的Promise错误:', reason);
});

// 监听全局JS错误
wx.onError((error) => {
	if (error && typeof error === 'string' && 
			(error.includes('Trace is not defined') || 
			 error.includes('WebAssembly.instantiate()') ||
			 error.includes('Cannot read property \'join\' of null'))) {
		// 忽略特定错误
		return;
	}
	console.error('全局JS错误:', error);
});

App({
	version: 'v2.0.0',
	/**
	 * 全局数据
	 */
	globalData: {
		// 保留少量必要的全局数据，其他数据通过MobX Store管理
		hasLogin: false,
	},
	
	/**
	 * 应用初始化
	 */
	onLaunch: function (options) {
		const that = this;
		this.init();
		
		// 设置默认项目为PLM
		try {
			// 检查是否有项目助手函数
			if (typeof this.setCurrentProject === 'function') {
				this.setCurrentProject('plm');
			} 
			else if (globalModules && globalModules.projectHelper && typeof globalModules.projectHelper.setCurrentProject === 'function') {
				globalModules.projectHelper.setCurrentProject('plm');
			} 
			else {
				// 设置全局项目标识
				this.globalData.currentProject = 'plm';
				wx.setStorageSync('CURRENT_PROJECT', 'plm');
				console.log('[应用初始化] 已设置默认项目为PLM');
			}
		} catch (error) {
			console.error('[应用初始化] 设置默认项目失败:', error);
		}
	},

	init: function () {
		const that = this;
		// 启用性能监控
		this._initPerformanceMonitor();
		
		// 初始化云环境
		if (!wx.cloud) {
			console.error('请使用 2.2.3 或以上的基础库以使用云能力');
		}
		else {
			wx.cloud.init({
				env: 'abitions-6gmak8fr92c59b33', // 实际环境ID
				traceUser: true
			});
			// PlanBiz初始化代码已移除，找不到相应实现
		}
		
		// 初始化全局MobX Store
		this._initGlobalStore();
		
		// 获取系统信息
		this._initSystemInfo();
		
		// 启用数据一致性检查
		this._initDataConsistencyChecker();
		
		// Store使用检查（开发环境）
		if (setting.IS_DEV) {
			console.log('[Store导入检查] 当前为开发环境，启用Store导入规范检查');
			try {
				const StoreImportUpdater = require('./projects/oa/helpers/store_import_updater');
				StoreImportUpdater.showStoreImportHelp();
				console.log('[Store导入检查] 完成，请注意开发过程中使用标准Store导入路径');
			} catch (e) {
				console.error('[Store导入检查] 检查工具加载失败', e);
			}
		}
		
		// 本地缓存清理
		this._cleanExpireCacheData();
		
		// 初始化全局数据
		this.initGlobalData();
	},
	
	/**
	 * 初始化性能监控
	 * @private
	 */
	_initPerformanceMonitor: function() {
		try {
			// 根据环境配置性能监控阈值
			const thresholds = setting.IS_DEV
				? {
						// 开发环境阈值较宽松
						pageLoad: 3000,
						dataFetch: 1500,
						render: 800,
						jsExecution: 500,
						apiCall: 1000
					}
				: {
						// 生产环境阈值较严格
						pageLoad: 2000,
						dataFetch: 1000,
						render: 500,
						jsExecution: 300,
						apiCall: 500
					};
			
			// 启用性能监控
			performanceMonitor.enable({
				maxLogCount: 200,
				thresholds
			});
			
			console.info('[性能监控] 性能监控已启用');
		} catch (error) {
			console.error('[性能监控] 初始化失败', error);
		}
	},
	
	/**
	 * 初始化数据一致性检查
	 * @private 
	 */
	_initDataConsistencyChecker: function() {
		try {
			// 仅在开发环境启用自动检查
			if (setting.IS_DEV) {
				// 安装自动一致性检查
				dataConsistencyChecker.installAutoCheck();
				console.info('[数据一致性] 自动一致性检查已启用');
			}
		} catch (error) {
			console.error('[数据一致性] 初始化失败', error);
		}
	},
	
	/**
	 * 初始化全局Store
	 * @private
	 */
	_initGlobalStore: function() {
		// 记录开始时间点
		performanceMonitor.mark('global_store_init_start', 'store_init');
		
		// 初始化顺序很重要
		uiStore.init();      // 初始化UI设置
		userStore.init();    // 初始化用户状态
		messageStore.init(); // 初始化消息状态
		cacheStore.init();   // 初始化缓存管理
		
		// 记录结束时间点并测量
		performanceMonitor.mark('global_store_init_end', 'store_init');
		performanceMonitor.measure(
			'GLOBAL_STORE_INIT', 
			'global_store_init_start', 
			'global_store_init_end'
		);
		
		// 监听存储变更
		this._setupStorageListener();
	},
	
	/**
	 * 获取系统信息
	 * @private
	 */
	_initSystemInfo: function() {
		try {
			// 记录开始时间点
			performanceMonitor.mark('system_info_start', 'system_init');
			
			// 使用SystemHelper获取系统信息
			SystemHelper.getSystemInfoAsync(true).then(systemInfo => {
				// 设置系统信息
				appStore.setSystemInfo(systemInfo);
				
				// 获取胶囊按钮信息
				const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
				appStore.setMenuButtonInfo(menuButtonInfo);
				
				// 记录结束时间点并测量
				performanceMonitor.mark('system_info_end', 'system_init');
				performanceMonitor.measure(
					'SYSTEM_INFO_INIT', 
					'system_info_start', 
					'system_info_end'
				);
			}).catch(error => {
				console.error('获取系统信息异常', error);
				errorHandler.logError(error, 'InitSystemInfo');
			});
		} catch (error) {
			console.error('系统信息初始化失败', error);
			errorHandler.logError(error, 'InitSystemInfo');
		}
	},
	
	/**
	 * 设置存储监听
	 * @private
	 */
	_setupStorageListener: function() {
		// 由于小程序不支持直接的存储事件，这里为将来可能的扩展预留
		// 可在多页面间通过自定义事件通信，同步状态变化
	},
	
	/**
	 * 应用显示
	 */
	onShow: function() {
		// 应用显示时记录时间点
		performanceMonitor.mark('app_show', 'app_lifecycle');
		
		// 应用显示时执行的逻辑
		// 检查用户登录状态
		if (userStore.isLogin) {
			// 刷新消息
			messageStore.refreshUnreadCount();
		}
	},
	
	/**
	 * 应用隐藏
	 */
	onHide: function() {
		// 应用隐藏时记录时间点
		performanceMonitor.mark('app_hide', 'app_lifecycle');
		
		// 如果存在对应的show标记，测量会话时长
		if (performanceMonitor._marks['app_show']) {
			performanceMonitor.measure(
				'APP_SESSION_DURATION', 
				'app_show', 
				'app_hide'
			);
		}
		
		// 应用隐藏时执行的逻辑
		// 保存未保存的数据
		cacheStore.flushPendingCache();
	},
	
	/**
	 * 错误处理
	 */
	onError: function(error) {
		// 记录错误发生时间
		performanceMonitor.mark('app_error', 'app_error');
		
		// 全局错误处理
		errorHandler.handlePageError(error, 'Global', { updateUI: true });
	},
	
	/**
	 * 页面未找到
	 */
	onPageNotFound: function(res) {
		// 页面未找到处理
		wx.redirectTo({
			url: '/pages/error/not_found'
		});
	},
	
	/**
	 * 本地缓存清理
	 * @private
	 */
	_cleanExpireCacheData: function() {
		// 实现本地缓存清理逻辑
	},
	
	/**
	 * 获取性能监控实例
	 * 供其他模块使用
	 */
	getPerformanceMonitor: function() {
		return performanceMonitor;
	},
	
	/**
	 * 获取数据一致性检查器实例
	 * 供其他模块使用
	 */
	getDataConsistencyChecker: function() {
		return dataConsistencyChecker;
	},
	
	/**
	 * 生成性能报告
	 * 开发环境或性能调试时使用
	 */
	generatePerformanceReport: function() {
		return performanceMonitor.generateReport();
	},
	
	/**
	 * 初始化全局数据
	 */
	initGlobalData: function() {
		this.globalData = {
			// 用户状态
			userInfo: null,
			isLoggedIn: false,
			
			// 系统信息
			systemInfo: wx.getSystemInfoSync(),
			
			// 屏幕尺寸，用于自适应
			screenHeight: wx.getSystemInfoSync().screenHeight,
			screenWidth: wx.getSystemInfoSync().screenWidth,
			
			// 刷新标志
			refreshFlags: {
				projectList: false,
				taskList: false
			}
		};
		
		// 尝试恢复用户登录状态
		this.checkAndRestoreUserInfo();
	},
	
	/**
	 * 检查并恢复用户信息
	 */
	checkAndRestoreUserInfo: function() {
		const userInfo = wx.getStorageSync('userInfo');
		const token = wx.getStorageSync('token');
		
		if (userInfo && token) {
			this.globalData.userInfo = userInfo;
			this.globalData.isLoggedIn = true;
		}
	},
	
	/**
	 * 设置需要刷新的页面标志
	 */
	setRefreshFlag: function(key, value = true) {
		if (this.globalData.refreshFlags.hasOwnProperty(key)) {
			this.globalData.refreshFlags[key] = value;
		}
	},
	
	/**
	 * 获取刷新标志并重置
	 */
	getAndResetRefreshFlag: function(key) {
		if (!this.globalData.refreshFlags.hasOwnProperty(key)) {
			return false;
		}
		
		const value = this.globalData.refreshFlags[key];
		this.globalData.refreshFlags[key] = false;
		return value;
	}
});